iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
Kubernetes

K8s 資料庫管理系統系列 第 25

day 25 k8s 財政部稅務資料庫管理系統

  • 分享至 

  • xImage
  •  

今天是第二十五天我們可以寫一個k8s財政部稅務資料庫管理系統,以下是我的程式碼

1. 資料庫選擇與設置

假設使用 PostgreSQL 作為稅務資料庫。

PostgreSQL 的 K8s 部署

首先,我們需要部署 PostgreSQL 資料庫:

# postgresql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:14
        ports:
        - containerPort: 5432
        env:
        - name: POSTGRES_DB
          value: "taxdb"  # 財政部稅務資料庫
        - name: POSTGRES_USER
          value: "taxadmin"
        - name: POSTGRES_PASSWORD
          value: "securepassword"
        volumeMounts:
        - name: postgres-storage
          mountPath: /var/lib/postgresql/data
      volumes:
      - name: postgres-storage
        persistentVolumeClaim:
          claimName: postgres-pvc
---
# postgresql-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: postgres-service
spec:
  selector:
    app: postgres
  ports:
    - protocol: TCP
      port: 5432
      targetPort: 5432
  type: ClusterIP
---
# postgres-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi  # 設定資料儲存空間大小

部署資料庫:

kubectl apply -f postgresql-deployment.yaml
kubectl apply -f postgresql-service.yaml
kubectl apply -f postgres-pvc.yaml

這些 YAML 檔案會在 Kubernetes 中部署 PostgreSQL,並建立 Persistent Volume Claim (PVC) 來持久儲存稅務資料。

2. API 後端應用程式部署

假設你有一個用於處理稅務資料的 API 後端服務,這裡使用 Node.js 範例:

Node.js API 應用程式的 Dockerfile:

dockerfile
# Dockerfile
FROM node:18

WORKDIR /usr/src/app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

Node.js 部署檔案:

# nodejs-api-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tax-api-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tax-api
  template:
    metadata:
      labels:
        app: tax-api
    spec:
      containers:
      - name: tax-api
        image: your-docker-repo/tax-api:latest
        ports:
        - containerPort: 3000
        env:
        - name: DATABASE_URL
          value: "postgresql://taxadmin:securepassword@postgres-service:5432/taxdb"
---
# nodejs-api-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: tax-api-service
spec:
  selector:
    app: tax-api
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000
  type: LoadBalancer

3. Web 前端部署

假設有一個 Web 前端用來顯示和操作稅務資料:

React 或其他前端框架的 Dockerfile:

dockerfile
# Dockerfile
FROM node:18

WORKDIR /usr/src/app

COPY package*.json ./
RUN npm install

COPY . .

RUN npm run build

EXPOSE 80

CMD ["npx", "serve", "-s", "build"]

Web 前端部署檔案:

# frontend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tax-frontend-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tax-frontend
  template:
    metadata:
      labels:
        app: tax-frontend
    spec:
      containers:
      - name: tax-frontend
        image: your-docker-repo/tax-frontend:latest
        ports:
        - containerPort: 80
---
# frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: tax-frontend-service
spec:
  selector:
    app: tax-frontend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

4. 監控與管理

可以使用 Prometheus 和 Grafana 來監控系統的資源使用情況和應用程式健康狀況:

  • 部署 PrometheusGrafana 監控服務。
  • 配置 Prometheus 來收集 Kubernetes 資源的數據。
  • 利用 Grafana 來視覺化資源使用和性能監控。

5. 部署應用程式

完成所有 YAML 檔案後,可以依次部署:

kubectl apply -f nodejs-api-deployment.yaml
kubectl apply -f nodejs-api-service.yaml
kubectl apply -f frontend-deployment.yaml
kubectl apply -f frontend-service.yaml

這樣,你將在 Kubernetes 上運行一個包括 PostgreSQL 資料庫、API 後端和 Web 前端的稅務資料管理系統。

6. 負載均衡與自動擴展

Kubernetes 可以使用 Horizontal Pod Autoscaler (HPA) 來根據 CPU 或記憶體使用情況自動擴展 API 和前端應用:

kubectl autoscale deployment tax-api-deployment --cpu-percent=50 --min=2 --max=10

這將在 CPU 使用率超過 50% 時自動擴展 API。

7. 持續整合與部署(CI/CD)

最後,為了提高開發效率,可以將這個系統集成到 CI/CD pipeline 中(如 Jenkins 或 GitLab CI),實現自動化測試與部署。

1. PostgreSQL 部署與服務

這部分是部署 PostgreSQL 資料庫。具體包括三個部分:DeploymentServicePersistentVolumeClaim

1.1. postgresql-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:14  # 使用 PostgreSQL 14 版的官方映像
        ports:
        - containerPort: 5432  # PostgreSQL 預設的連接埠
        env:
        - name: POSTGRES_DB
          value: "taxdb"  # 稅務資料庫的名稱
        - name: POSTGRES_USER
          value: "taxadmin"  # 資料庫管理員用戶名稱
        - name: POSTGRES_PASSWORD
          value: "securepassword"  # 用於管理員的密碼
        volumeMounts:
        - name: postgres-storage
          mountPath: /var/lib/postgresql/data  # 將數據存儲在資料庫的指定路徑中
      volumes:
      - name: postgres-storage
        persistentVolumeClaim:
          claimName: postgres-pvc  # 持久存儲配置
  • Deployment 是 Kubernetes 中的基本資源,用來管理應用的副本數量(replicas),並確保應用的穩定運行。這裡設置了一個副本。
  • containerPort: 5432 表示 PostgreSQL 的預設端口號,這個端口允許應用程序連接資料庫。
  • POSTGRES_DBPOSTGRES_USERPOSTGRES_PASSWORD 是環境變數,用來設置資料庫名稱、用戶和密碼。
  • volumeMounts 定義了 PostgreSQL 資料儲存的路徑,讓資料持久化存儲。

1.2. postgresql-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: postgres-service
spec:
  selector:
    app: postgres
  ports:
    - protocol: TCP
      port: 5432
      targetPort: 5432
  type: ClusterIP  # 預設內部網路型服務
  • Service 是 Kubernetes 中用來管理一組 Pod 的網路訪問資源。這裡的服務會選擇標籤為 app: postgresPod,並將流量路由到 5432 端口。
  • type: ClusterIP 表示這個服務只會在 Kubernetes 內部網路中暴露,不能被外部直接訪問。

1.3. postgres-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi  # 設定儲存空間大小為 5GB
  • PersistentVolumeClaim (PVC) 用來申請持久化存儲資源。這裡設置了 5GB 的儲存空間,確保資料庫數據不會因為 Pod 重啟而丟失。

2. Node.js API 應用程式的部署

這部分是處理稅務資料的後端 API 應用。它連接到 PostgreSQL,並提供 RESTful API 來查詢和操作稅務資料。

2.1. Node.js 的 Dockerfile

dockerfile
# Dockerfile
FROM node:18  # 使用 Node.js 18 作為基底映像

WORKDIR /usr/src/app  # 設置工作目錄

COPY package*.json ./  # 複製 package.json 和 package-lock.json 檔案
RUN npm install  # 安裝 Node.js 所需的套件

COPY . .  # 複製當前目錄下所有檔案到工作目錄中

EXPOSE 3000  # 暴露 API 端口
CMD ["npm", "start"]  # 運行 npm start 來啟動應用程式
  • 這是一個典型的 Node.js 應用程序的 Dockerfile,將程式碼包裝成 Docker 映像。
  • npm install 安裝應用所需的依賴,npm start 是啟動命令。
  • EXPOSE 3000 表示 Node.js 應用會在 3000 端口上運行。

2.2. nodejs-api-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tax-api-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tax-api
  template:
    metadata:
      labels:
        app: tax-api
    spec:
      containers:
      - name: tax-api
        image: your-docker-repo/tax-api:latest  # 從你的 Docker Hub 拉取最新的應用映像
        ports:
        - containerPort: 3000
        env:
        - name: DATABASE_URL
          value: "postgresql://taxadmin:securepassword@postgres-service:5432/taxdb"  # 資料庫連接字串
  • 這個 Deployment 會啟動兩個(replicas: 2)API 應用的副本,來處理使用者請求並確保高可用性。
  • DATABASE_URL 環境變數指定 API 連接的 PostgreSQL 資料庫的詳細資訊。
  • 這些 API 副本會監聽 3000 端口。

2.3. nodejs-api-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: tax-api-service
spec:
  selector:
    app: tax-api
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000
  type: LoadBalancer
  • 這個 Service 暴露 API 應用並將流量轉發到 3000 端口。
  • type: LoadBalancer 會自動建立外部負載均衡器,允許外部使用者通過公開的 IP 地址訪問 API。

3. Web 前端部署

這部分是 Web 前端,用於視覺化和操作稅務資料。

3.1. React 的 Dockerfile

dockerfile
FROM node:18  # 使用 Node.js 18 作為基底映像

WORKDIR /usr/src/app

COPY package*.json ./
RUN npm install  # 安裝前端所需的依賴

COPY . .

RUN npm run build  # 編譯 React 應用程式

EXPOSE 80

CMD ["npx", "serve", "-s", "build"]  # 使用 serve 套件來運行靜態文件
  • 這個 Dockerfile 用來構建和運行 React 前端應用,npm run build 會將應用編譯為靜態資源並在 80 端口提供服務。

3.2. frontend-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tax-frontend-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tax-frontend
  template:
    metadata:
      labels:
        app: tax-frontend
    spec:
      containers:
      - name: tax-frontend
        image: your-docker-repo/tax-frontend:latest  # 拉取前端映像
        ports:
        - containerPort: 80  # 前端應用會運行在 80 端口
  • 部署了兩個副本來運行前端應用,並確保高可用性。

3.3. frontend-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: tax-frontend-service
spec:
  selector:
    app: tax-frontend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer
  • 前端 Service 會將 HTTP 請求導向 80 端口,並通過負載均衡器讓外部使用者可以訪問這個 Web 前端應用。

這個完整的 Kubernetes 部署系統為財政部的稅務資料管理提供了高效、可擴展且易於管理的解決方案。


上一篇
day 24 k8s奧運資料庫管理系統
下一篇
day 26 k8s農業部資料庫管理系統
系列文
K8s 資料庫管理系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言